#include <event2/event.h>
#include <event2/listener.h>
#include <string.h>

#include "xthread_pool.h"
#include "xftp_server_cmd.h"


#ifndef _WIN32
#include <signal.h>
#endif

#include <iostream>
using namespace std;

#define SPORT 5001

void listen_cb(struct evconnlistener* e, evutil_socket_t s, struct sockaddr* a, int socklen, void* arg) {
	cout << "listen_cb" << endl;
	
	XTask *task = new XFtpServerCmd();
	task->sock = s;
	XThreadPool::Get()->Dispatch(task);
}

int main() {
#ifdef _WIN32
	// 初始socket库
	WSADATA wsa;
	WSAStartup(MAKEWORD(2, 2), &wsa);
#else
	// 忽略管道信号, 发送数据给已关闭的socket
	if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
		return 1;
	}
#endif
	
	// 1.初始化线程池
	XThreadPool::Get()->Init(10);	
	
	cout << "test thread pool!" << endl;

	// 创建libevent的上下文
	event_base* base = event_base_new();
	if (base) {
		cout << "event_base_new success!" << endl;
	}

	sockaddr_in sin;
	memset(&sin, 0, sizeof(sockaddr_in));
	sin.sin_family = AF_INET;
	sin.sin_port = htons(SPORT);

	// 监听端口
	// socket bind, listen
	evconnlistener* ev = evconnlistener_new_bind(base, // libevent上下文
		listen_cb, // 接收到连接的回调函数
		base, // 回调函数获取的参数arg
		LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, // 地址重用以及关闭时释放
		10, // 连接队列大小，对应listen函数
		(sockaddr*)&sin, sizeof(sin));// 绑定的地址和端口

	// 事件分发处理
	event_base_dispatch(base);

	if (ev) {
		evconnlistener_free(ev);
	}
	
	if (base) {
		event_base_free(base);
	}

#ifdef _WIN32
	WSACleanup();
#endif
	
	return 0;
}

